#!/usr/bin/python
# -*- coding: utf-8 -*-
from numpy import *
from cv import *
from numpy import *
from numpy.linalg import *
from numpy.dual import eig
from numpy.oldnumeric.mlab import cov

def buyumebul(dosyaadi1,dosyaadi2,refadi1,refadi2):
    sabit        = 150
    refres1      = LoadImage('data/'+refadi1)
    refres2      = LoadImage('data/'+refadi2)
    res1         = LoadImage('data/'+dosyaadi1)
    res2         = LoadImage('data/'+dosyaadi2)
    refgri1      = gri(refres1)
    refgri2      = gri(refres2)
    I            = gri(res1)
    J            = gri(res2)
    ref1iki      = ikilik(refgri1,sabit)
    ref2iki      = ikilik(refgri2,sabit)
    I            = ikilik(I,sabit)
    J            = ikilik(J,sabit)
    ref1kenar    = kenarbul(ref1iki)
    ref2kenar    = kenarbul(ref2iki)
    Ikenar       = kenarbul(I)
    Jkenar       = kenarbul(J)
    ref1,x1r,y1r = kutucukyarat(ref1kenar)
    ref2,x2r,y2r = kutucukyarat(ref2kenar)
    Ikutu,x1,y1  = kutucukyarat(Ikenar)
    Jkutu,x2,y2  = kutucukyarat(Jkenar)
    a,b = oranbul(x1r,y1r,x2r,y2r)
    buyy1,buyx1  = oranbul(x1,y1,x1r,y1r)
    #sx1,sy1      = GetSize(res1);sx1 *= buyx1;sy1 *= buyy1
    #sx2,sy2      = GetSize(res2);sx2 *= buyx2;sy2 *= buyy2
    #yeniresim1   = CreateImage((int(sx1),int(sy1)), IPL_DEPTH_8U, 1)
    #yeniresim2   = CreateImage((int(sx2),int(sy2)), IPL_DEPTH_8U, 1)
    #Resize(ref1iki,yeniresim1,CV_INTER_CUBIC)
    #Resize(ref2iki,yeniresim2,CV_INTER_CUBIC)
    print '   İlk resim için X eksenindeki büyüme: ',buyx1,' Y eksenindeki büyüme: ',buyy1
    print '           X eksenindeki odak uzaklığı: ',int(odakbul(buyx1))
    print '           Y eksenindeki odak uzaklığı: ',int(odakbul(buyy1))
    #resmigoster(ref1iki,'Sayısal düzen: on.jpg')
    #resmigoster(ref2iki,'Sayısal düzen: arka.jpg')
    resmigoster(I,'Sayısal düzen: onmercek.jpg')
    #resmigoster(J,'Sayısal düzen: arkamercek.jpg ')
    resmigoster(Ikenar,'onmercek.jpg için kenarlar')
    #resmigoster(Jkenar,'arkamercek.jpg için kenarlar')
    #resmigoster(ref1kenar,'on.jpg için kenarlar')
    #resmigoster(ref2kenar,'arka.jpg için kenarlar')
    resmigoster(Ikutu,'onmercek.jpg için kutucuk')
    #resmigoster(Jkutu,'arkamercek.jpg için kutucuk')
    #resmigoster(ref1,'on.jpg için kutucuk')
    #resmigoster(ref2,'arka.jpg için kutucuk')
    #resmigoster(yeniresim1,'Büyütülmüş yeni resim 1')
    #resmigoster(yeniresim2,'Büyütülmüş yeni resim 2')
    return 

def odakbul(m):
    d         = 36
    do        = 71
    odak      = m*do*d/(do+d)/(m-1)
    return odak 

def oranbul(x1,y1,x2,y2):
    buyx  = float(amax(x1)-amin(x1))/(amax(x2)-amin(x2))
    buyy  = float(amax(y1)-amin(y1))/(amax(y2)-amin(y2))
    return buyx,buyy

def kutucukyarat(resim):
    x=[];y=[];count=0
    araresim = asarray(GetMat(resim))
    boyutlar = araresim.shape
    kutular  = CreateImage(GetSize(resim), IPL_DEPTH_8U, 1)
    j        = boyutlar[1]/2
    for i in xrange(0,boyutlar[0]):
        if araresim[i][j]>0:
            if araresim[i-1][j-1]<255:
                kutular[i,j]=255
                x.append(i)
                y.append(j)
    i        = boyutlar[0]/2
    for j in xrange(0,boyutlar[1]):
        if araresim[i][j]>0:
            if araresim[i-1][j-1]<255:
                kutular[i,j]=255
                x.append(i)
                y.append(j)
    return kutular,x,y

def ikilik(resim,sabit):
    [nx,ny]  = GetSize(resim)
    araresim = GetMat(resim)
    for i in xrange(0,nx-1):
        for j in xrange(0,ny-1):
            if araresim[j,i] > sabit:
               araresim[j,i] = 255
            else:
               araresim[j,i] = 0
    return resim

def kenarbul(resim):
    for i in xrange(5):
        Smooth(resim,resim,param1=7)
    boyutlar = GetSize(resim)
    kenarlar = CreateImage(boyutlar, IPL_DEPTH_8U, 1)
    Canny(resim,kenarlar,40.0,60.0)
    return kenarlar

def resmigoster(resim,baslik):
    NamedWindow(baslik,1)
    ShowImage(baslik,resim)
    WaitKey(0)
    return True

def buyume(x1,y1,x2,y2):
    if len(x1)>=len(x2):
      sinir = len(x2)
    else:
      sinir = len(x1)
    A = zeros((sinir,2))
    b = zeros((sinir,1))
    for i in xrange(0,3):
        if i%2==0:
            A[i,0] = x1[i]
            b[i]   = x2[i]
        else:
            A[i,1] = y1[i]
            b[i]   = y2[i]
    [buyx,buyy] = dot(pinv(dot(A.T,A)),dot(A.T,b))
    return buyx,buyy

def gri(resim):
    gri = CreateImage(GetSize(resim), IPL_DEPTH_8U, 1)
    CvtColor(resim, gri,CV_RGB2GRAY)
    return gri

def ana():
    buyumebul('onmercek250mmxy.jpg','arkamercekxy.jpg','on.jpg','arka.jpg')
    buyumebul('onmercek150mmx.jpg','arkamercekxy.jpg','on.jpg','arka.jpg')
    return True
    
if __name__ == '__main__':
    ana()